package com.shujia.day07.ketang;

class Person{
    static String feature;
    int age = 18;

    public Person() {
    }

    public Person(String feature) {
        this.feature = feature;
    }

    public void eat(){
        System.out.println("我是"+feature+"只要是吃的都我可以..");
    }

    public static void show(){
        System.out.println("这是一个静态变量"+Person.feature);
    }



}

class SouthPerson extends Person {

    public SouthPerson() {
    }

    public SouthPerson(String feature) {
        super(feature);
    }

    @Override
    public void eat(){
        System.out.println("我是"+feature+",我爱吃米饭..");
    }
}


class NorthPerson extends Person{

    int age = 16;

    public NorthPerson(String feature) {
        super(feature);
    }

    public NorthPerson() {
    }

    @Override
    public void eat(){
        System.out.println("我是"+feature+",我爱吃面食..");
    }

    public static void show(){
        System.out.println("这是一个子类静态变量"+Person.feature);
    }

    public void northPersonFunction(){
        System.out.println("这是北方人独有的方法...");
    }
}



public class Code01DuotaiDemo {
    public static void main(String[] args) {
        /*
            人类：成员变量 -> 特征  成员方法 -> eat()
                - 北方人
                - 南方人
         */

        // 多态的形式
        Person northPerson = new NorthPerson("北方人");

        // 特点：
        System.out.println(northPerson.feature);

        // 1.对于成员变量来说，如果变量父类和子类不同，那么运行时，看左边类是什么，再获取其中的变量
        System.out.println(northPerson.age);

        // 2.对于成员方法，编译看左，运行看右
        northPerson.eat(); // 我是北方人,我爱吃面食..

        // 3.对于静态方法，编译看左，运行看左  不推荐这种写法 建议使用Person.show()
//        northPerson.show();

        // 编译看左 左边Person类并没有对应的方法，所以会编译报错...
//        northPerson.northPersonFunction();


        useEat(new Person());
        useEat(new NorthPerson()); //多态
        useEat(new SouthPerson()); //多态

    }

    // 多态应用：在参数传递时，可以给定当前类及其子类
    // 该方式非常常用 在开过程中可以通过这种方式，避免对开发过的类进行大量修改
    //      如果有新的需求，比如南方人，那么可以直接创建一个南方人类继承人类，再将南方人对象进行传递到该方法中，进行调用即可
    public static void useEat(Person person){
        person.eat();
    }
}
